package me.zhengjie.modules.account.factory.entity;


import com.alibaba.fastjson2.JSON;
import lombok.Data;
import me.zhengjie.modules.account.factory.vo.CheckDetail;
import me.zhengjie.tool.*;
import me.zhengjie.vo.Constant;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 *
 */
@Data
public class SpecialAccount {
    private static final long serialVersionUID = 1234567L;
    private String acc001;  //人员编号
    private String aaz116;  //账户ID
    private Integer aae206;  //建账年月
    private String aaz159;  //参保关系ID
    private String aab359;  //参保机构
    private int count;  //ac08月数
    private List<Map> accountDetail;//账户台账
    private List<Map> ac08Detail;//缴费明细
    private MyMap ae22Map;
    private List<MyMap> ac50a5s;//年度转换集合
    private List<MyMap> resultList;//计算结果
    private List<Map> ac51s;//转ac51集合
    private Map ac02Map;
    private Map ae45b7Map;
    private BigDecimal aae238;//本金
    private BigDecimal aae239;//利息
    private BigDecimal aae240;//余额

    /**
     * 拆分采集账户
     * 将特殊账户拆分成AC08
     */
    public void accountSplit() {
        check();
        ac08Detail = new ArrayList<>();
        ae22Map = new MyMap();
        //拆分Ac51、AC08
        BigDecimal moneySum = BigDecimal.ZERO;
        for (Map map : this.accountDetail) {
            MyMap myMap = new MyMap(map);
            Integer aae001 = myMap.getAsInteger("aae001");//年度
            Integer bae084 = myMap.getAsInteger("bae084");//缴费月数
            BigDecimal aae180 = myMap.getAsBigDecimal("aae180");//缴费基数
            Integer bae095 = myMap.getAsInteger("bae095");//年度月数
            BigDecimal aae262 = myMap.getAsBigDecimal("aae262");//单位划入本金
            BigDecimal aae264 = myMap.getAsBigDecimal("aae264");//个人划入本金
            moneySum = moneySum.add(aae262).add(aae264);
            if (bae084 > 0) {
                //循环每月存入
                int month_n = 0;
                Integer aae003 = aae206;
                while (month_n < bae084) {
                    getAae003(aae003, aae001, month_n, bae095);
                    //单位划入 = 单位年度划入金额 / 实缴月数 保留2位小数
                    BigDecimal aae020_average = aae262.divide(BigDecimal.valueOf(bae084), BigDecimal.ROUND_HALF_UP);
                    //计算单位缴费四舍五入差额
                    BigDecimal aae020Tmp = aae262.subtract(aae020_average.multiply(BigDecimal.valueOf(bae084)));
                    //将四舍五入差额放到第一个月上
                    BigDecimal aae020_first = aae020_average.add(aae020Tmp);

                    //个人划入 = 个人年度划入金额 / 实缴月数 保留2位小数
                    BigDecimal aae022_average = aae264.divide(BigDecimal.valueOf(bae084), BigDecimal.ROUND_HALF_UP);
                    //计算个人缴费四舍五入差额
                    BigDecimal aae022Tmp = aae264.subtract(aae022_average.multiply(BigDecimal.valueOf(bae084)));
                    //将四舍五入差额放到第一个月上
                    BigDecimal aae022_first = aae022_average.add(aae022Tmp);

                    if (month_n == 0) {//第一条数据
                        myMap.put("aae020", aae020_first);//单位应缴
                        myMap.put("aae021", aae020_first);//单位划账户应缴
                        myMap.put("aae080", aae020_first);//单位实缴
                        myMap.put("aae081", aae020_first);//单位实缴划账户
                        myMap.put("aae022", aae022_first);//个人应缴
                        myMap.put("aae023", aae022_first);//个人应缴划账户
                        myMap.put("aae082", aae022_first);//个人实缴
                        myMap.put("aae083", aae022_first);//个人实缴划账户
                    } else {
                        myMap.put("aae020", aae020_average);//单位应缴
                        myMap.put("aae021", aae020_average);//单位划账户应缴
                        myMap.put("aae080", aae020_average);//单位实缴
                        myMap.put("aae081", aae020_average);//单位实缴划账户
                        myMap.put("aae022", aae022_average);//个人应缴
                        myMap.put("aae023", aae022_average);//个人应缴划账户
                        myMap.put("aae082", aae022_average);//个人实缴
                        myMap.put("aae083", aae022_average);//个人实缴划账户
                    }
                    myMap.put("aab121", aae180);//缴费基数
                    myMap.put("aae180", aae180);
                    myMap.put("aae795", aae180);
                    myMap.putAll(ac02Map);
                    myMap.put("aac040", aae180);
                    myMap.put("aae202", 1);//缴费月数
                    myMap.put("aab001", this.aab359);//单位编号
                    myMap.put("aaa115", Constant.AAA115_9023_CJZHRD.substring(0, 2));
                    myMap.put("aae793", Constant.AAA115_9023_CJZHRD);
                    myMap.put("aae794", "采集账户认定");
                    CheckDetail checkDetail = new CheckDetail(myMap);
                    Map map1 = JSON.parseObject(String.valueOf(checkDetail), Map.class);
                    ac08Detail.add(map1);
                    month_n++;
                }
            }
        }

        ae22Map.put("aae140", Constant.AAE140_110_QYZGJBYLBX);
        ae22Map.put("aaz159", this.aaz159);
        ae22Map.put("aae019", moneySum);
    }

    public void accountUpdate() {
        this.ac08Detail = new ArrayList<>();
        List<Map> ac51tmp = this.ac51s.stream().filter(map -> !Constant.AAA513_2_LZH.equals(map.get("aaa513"))).collect(Collectors.toList());
        Map<String, List<Map>> ac51OldMap;
        if (!ValidateUtil.isEmpty(ac51tmp)) {
            ac51OldMap = ac51tmp.stream().collect(Collectors.groupingBy(map -> map.get("aae001").toString()));
        } else {
            ac51OldMap = new HashMap<>();
        }
        List<Map> minAae001s = this.accountDetail.stream().filter(map -> Constant.AAA513_2_LZH.equals(map.get("aaa513"))).collect(Collectors.toList());
        Integer minAae001 = minAae001s.stream().map(map -> new MyMap(map).getAsInteger("aae001")).min(Integer::compareTo).orElse(0);//采集账户的最小年度
        this.resultList = new ArrayList<>();
        this.aae238 = BigDecimal.ZERO;
        this.aae239 = BigDecimal.ZERO;
        this.aae240 = BigDecimal.ZERO;
        for (Map map : this.accountDetail) {
            MyMap myMap = new MyMap(map);
            Integer aae001 = myMap.getAsInteger("aae001");
            List<Map> ac51OldList = ac51OldMap.get(aae001.toString());
            if (ValidateUtil.isEmpty(ac51OldList)) {
                ac51OldList = new ArrayList<>();
            }
            BigDecimal aae262 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae262")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae262");//本年单位缴费部分划入个人账户本金
            BigDecimal aae263 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae263")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae263");//本年单位缴费部分划入个人账户利息
            BigDecimal aae264 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae264")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae264");//本年个人缴费部分划入个人账户本金
            BigDecimal aae265 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae265")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae265");//本年个人缴费部分划入个人账户利息
            BigDecimal aae855 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae855")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae855");//本年其他部分划入个人账户本金
            BigDecimal aae856 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae856")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae856");//本年其他部分划入个人账户利息
            BigDecimal aae849 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae849")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae849");//截至上年末个人账户单位缴费部分划转累计本息
            BigDecimal aae259 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae259")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae259");//截至上年末个人账户单位缴费部分划转本息在本年产生的利息
            BigDecimal aae851 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae851")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae851");//截至上年末个人账户个人缴费部分划转累计本息
            BigDecimal aae260 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae260")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae260");//截至上年末个人账户个人缴费部分划转本息在本年产生的利息
            BigDecimal aae853 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae853")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae853");//截至上年末个人账户其他部分划转累计本息
            BigDecimal aae854 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae854")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae854");//截至上年末个人账户其他部分划转本息在本年产生的利息

            BigDecimal aae850 = aae849.add(aae259).add(aae262).add(aae263);//截至本年末个人账户单位缴费部分划转累计本息
            BigDecimal aae852 = aae851.add(aae260).add(aae264).add(aae265);//截至本年末个人账户个人缴费部分划转累计本息
            BigDecimal aae857 = aae853.add(aae854).add(aae855).add(aae856);//截至本年末个人账户其他部分划转累计本息

            BigDecimal aae873 = aae262.add(aae264).add(aae855);//本年本金总和
            BigDecimal aae874 = aae263.add(aae265).add(aae856).add(aae259).add(aae260).add(aae854);//本年利息总和

            //总台账 - 非采集账户
            if (aae001 >= minAae001) {
                List<MyMap> ac51Maps = ListUtil.list2MyMapList(ac51OldList);
                //减去正常部分,采集部分入ac50a4
                BigDecimal zc_aae262 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae262")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae262")).reduce(BigDecimal.ZERO, BigDecimal::add);//1、本年单位缴费部分划入个人账户本金
                BigDecimal zc_aae263 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae263")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae263")).reduce(BigDecimal.ZERO, BigDecimal::add);//2、本年单位缴费部分划入个人账户利息
                BigDecimal zc_aae264 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae264")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae264")).reduce(BigDecimal.ZERO, BigDecimal::add);//3、本年个人缴费部分划入个人账户本金
                BigDecimal zc_aae265 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae265")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae265")).reduce(BigDecimal.ZERO, BigDecimal::add);//4、本年个人缴费部分划入个人账户利息
                BigDecimal zc_aae855 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae855")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae855")).reduce(BigDecimal.ZERO, BigDecimal::add);//5、本年其他部分划入个人账户本金
                BigDecimal zc_aae856 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae856")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae856")).reduce(BigDecimal.ZERO, BigDecimal::add);//6、本年其他部分划入个人账户利息
                BigDecimal zc_aae849 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae849")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae849")).reduce(BigDecimal.ZERO, BigDecimal::add);//截至上年末个人账户单位缴费部分划转累计本息
                BigDecimal zc_aae259 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae259")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae259")).reduce(BigDecimal.ZERO, BigDecimal::add);//截至上年末个人账户单位缴费部分划转本息在本年产生的利息
                BigDecimal zc_aae851 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae851")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae851")).reduce(BigDecimal.ZERO, BigDecimal::add);//截至上年末个人账户个人缴费部分划转累计本息
                BigDecimal zc_aae260 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae260")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae260")).reduce(BigDecimal.ZERO, BigDecimal::add);//截至上年末个人账户个人缴费部分划转本息在本年产生的利息
                BigDecimal zc_aae853 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae853")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae853")).reduce(BigDecimal.ZERO, BigDecimal::add);//截至上年末个人账户其他部分划转累计本息
                BigDecimal zc_aae854 = ac51Maps.stream().map(ac51Map -> ValidateUtil.isEmpty(ac51Map.getAsBigDecimal("aae854")) ? BigDecimal.ZERO : ac51Map.getAsBigDecimal("aae854")).reduce(BigDecimal.ZERO, BigDecimal::add);//截至上年末个人账户其他部分划转本息在本年产生的利息

                BigDecimal zc_aae850 = zc_aae849.add(zc_aae259).add(zc_aae262).add(zc_aae263);//截至本年末个人账户单位缴费部分划转累计本息
                BigDecimal zc_aae852 = zc_aae851.add(zc_aae260).add(zc_aae264).add(zc_aae265);//截至本年末个人账户个人缴费部分划转累计本息
                BigDecimal zc_aae857 = zc_aae853.add(zc_aae854).add(zc_aae855).add(zc_aae856);//截至本年末个人账户其他部分划转累计本息


                BigDecimal zc_aae873 = zc_aae262.add(zc_aae264).add(zc_aae855);
                BigDecimal zc_aae874 = zc_aae263.add(zc_aae265).add(zc_aae856).add(zc_aae259).add(zc_aae260).add(zc_aae854);

                myMap.put("aae262", aae262.subtract(zc_aae262));//本年单位缴费部分划入个人账户本金
                myMap.put("aae263", aae263.subtract(zc_aae263));//本年单位缴费部分划入个人账户利息
                myMap.put("aae264", aae264.subtract(zc_aae264));//本年个人缴费部分划入个人账户本金
                myMap.put("aae265", aae265.subtract(zc_aae265));//本年个人缴费部分划入个人账户利息
                myMap.put("aae855", aae855.subtract(zc_aae855));//本年其他部分划入个人账户本金
                myMap.put("aae856", aae856.subtract(zc_aae856));//本年其他部分划入个人账户利息

                myMap.put("aae849", aae849.subtract(zc_aae849));//截至上年末个人账户单位缴费部分划转累计本息
                myMap.put("aae259", aae259.subtract(zc_aae259));//截至上年末个人账户单位缴费部分划转本息在本年产生的利息
                myMap.put("aae851", aae851.subtract(zc_aae851));//截至上年末个人账户个人缴费部分划转累计本息
                myMap.put("aae260", aae260.subtract(zc_aae260));//截至上年末个人账户个人缴费部分划转本息在本年产生的利息
                myMap.put("aae853", aae853.subtract(zc_aae853));//截至上年末个人账户其他部分划转累计本息
                myMap.put("aae854", aae854.subtract(zc_aae854));//截至上年末个人账户其他部分划转本息在本年产生的利息

                myMap.put("aae850", aae850.subtract(zc_aae850));//截至上年末个人账户个人缴费部分划转本息在本年产生的利息
                myMap.put("aae852", aae852.subtract(zc_aae852));//截至上年末个人账户其他部分划转累计本息
                myMap.put("aae857", aae857.subtract(zc_aae857));//截至上年末个人账户其他部分划转本息在本年产生的利息

                myMap.put("aae873", aae873.subtract(zc_aae873));//本年本金总和
                myMap.put("aae874", aae874.subtract(zc_aae874));//本年利息总和
                myMap.put("aaa031", myMap.getAsString("baa054"));//利率
                myMap.put("aaz117", "");
                myMap.put("aaz116", this.aaz116);
                myMap.put("aic376", DateUtil.getCurrentTime("yyyyMMdd"));
                myMap.put("aaz159", this.aaz159);
                myMap.put("aaa119", Constant.AAA119_11_QYZGJBYLBXGRZH);
                myMap.put("aaa513", Constant.AAA513_2_LZH);
            //    myMap.putAll(this.getBusinessLog().getAsHandleMap());
                makeAc08(myMap);//生成明细
                this.resultList.add(myMap);
                this.aae238 = this.aae238.add(myMap.getAsBigDecimal("aae262")).add(myMap.getAsBigDecimal("aae264")).add(myMap.getAsBigDecimal("aae855"));
                this.aae239 = this.aae239.add(myMap.getAsBigDecimal("aae263")).add(myMap.getAsBigDecimal("aae265")).add(myMap.getAsBigDecimal("aae856")).add(myMap.getAsBigDecimal("aae259")).add(myMap.getAsBigDecimal("aae260")).add(myMap.getAsBigDecimal("aae854"));
                this.aae240 = this.aae238.add(this.aae239);
            }
        }

    }

    /**
     * 校验采集账户
     *
     * @param ac50A4
     */
    public void accountCheck(List<MyMap> ac50A4) {
        ac50A4.sort(Comparator.comparing(map -> Integer.valueOf(map.get("aae001").toString())));
        Map<String, List<MyMap>> ac50A4Map = ac50A4.stream().collect(Collectors.groupingBy(map -> map.get("aae001").toString()));
        ac50A4.forEach(map -> {
            StringBuffer errMsg = new StringBuffer();
            MyMap myMap = new MyMap(map);
            Integer aae001 = myMap.getAsInteger("aae001");//年度
            BigDecimal baa054 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("baa054")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("baa054");//当年利率
            BigDecimal aae797 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae797")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae797");//社平
            BigDecimal baa055 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("baa055")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("baa055");//历年利率
            BigDecimal aae201 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae201")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae201");//应缴月数
            BigDecimal aae202 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae202")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae202");//缴费月数
            BigDecimal aae262 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae262")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae262");//单位划入本金
            BigDecimal aae263 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae263")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae263");//单位划入利息
            BigDecimal aaa043 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aaa043")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aaa043");//单位划入比例
            BigDecimal aae264 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae264")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae264");//个人划入本金
            BigDecimal aae265 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae265")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae265");//个人划入利息
            BigDecimal aaa045 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aaa045")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aaa045");//个人划入比例
            BigDecimal aae855 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae855")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae855");//社平划入本金
            BigDecimal aae856 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae856")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae856");//社平划入利息
            BigDecimal aae819 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae819")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae819");//社平划入比例
            BigDecimal aae849 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae849")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae849");//截至上年末个人账户单位缴费部分划转累计本息
            BigDecimal aae259 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae259")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae259");//截至上年末个人账户单位缴费部分划转本息在本年产生的利息
            BigDecimal aae851 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae851")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae851");//截至上年末个人账户个人缴费部分划转累计本息
            BigDecimal aae260 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae260")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae260");//截至上年末个人账户个人缴费部分划转本息在本年产生的利息
            BigDecimal aae853 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae853")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae853");//截至上年末个人账户其他部分划转累计本息
            BigDecimal aae854 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae854")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae854");//截至上年末个人账户其他部分划转本息在本年产生的利息
            BigDecimal aae878 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae878")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae878");//截至本年末个人账户总额
            String aae825 = map.get("aae825").toString();//手工录入标志
            BigDecimal aae180 = myMap.getAsBigDecimal("aae180");//缴费基数
            BigDecimal decimal = BigDecimal.ZERO;
            //校验基数
            if (aae180 == null || aae180.compareTo(decimal) < 0) {
                errMsg.append(aae001 + "年:缴费基数不能小于0或为空;");
            }
            //个人划入比例
            if (aaa045 == null || aaa045.compareTo(decimal) < 0) {
                errMsg.append(aae001 + "年:个人比例不能小于0或为空;");
            }
            //2006年前
            if (aaa045.add(aaa043).multiply(new BigDecimal(100)).compareTo(BigDecimal.valueOf(11)) != 0 && aae001 < 2006 && aae202.compareTo(BigDecimal.ZERO) > 0) {
                errMsg.append(aae001 + "年:个人比例加单位不为11%;");
            }
            //2006年后
            if (aaa045.add(aaa043).multiply(new BigDecimal(100)).compareTo(BigDecimal.valueOf(8)) != 0 && aae001 >= 2006 && aae202.compareTo(BigDecimal.ZERO) > 0) {
                errMsg.append(aae001 + "年:个人比例加单位不为8%;");
            }
            //单位划入比例2006年前
            if (aaa043 == null || (aaa043.compareTo(decimal) <= 0 && aae001 < 2006 && aae202.compareTo(BigDecimal.ZERO) > 0)) {
                errMsg.append(aae001 + "年:年度的单位划入比例不允许为空;");
            }
            //单位划入比例2006年后
            if (aaa043.compareTo(decimal) != 0 && aae001 >= 2006) {
                errMsg.append(aae001 + "年:年度的单位划入比例必须为0;");
            }
            //社平划拨 95 96 97
            if (aae819.multiply(new BigDecimal(100)).compareTo(BigDecimal.valueOf(5)) != 0 && (aae001 == 1995 || aae001 == 1996 || aae001 == 1997)) {
                errMsg.append(aae001 + "年:年度的社平划入比例不为5%;");
            }
            //社平划拨 95 96 97
            if (aae819.compareTo(decimal) != 0 && (aae001 != 1995 && aae001 != 1996 && aae001 != 1997)) {
                errMsg.append(aae001 + "年:年度的社平划入比例只允许为0;");
            }
            //当年利率
            if (baa054 == null || (baa054.compareTo(decimal) <= 0 && !Constant.BAE926_1_S.equals(aae825)) || (baa054.compareTo(decimal) < 0 && Constant.BAE926_1_S.equals(aae825))) {
                errMsg.append(aae001 + "年:年度的当年利率不允许小于零;");
            }
            //历年利率
            if (baa054 == null || (baa055.compareTo(decimal) <= 0 && !Constant.BAE926_1_S.equals(aae825)) || (baa055.compareTo(decimal) < 0 && Constant.BAE926_1_S.equals(aae825))) {
                errMsg.append(aae001 + "年:年度的历年利率不允许小于零;");
            }
            //应缴月数
            if (aae201.compareTo(aae202) < 0) {
                errMsg.append(aae001 + "年:年度的应缴月数不能小于实缴月数;");
            }

            /**
             * 横向校验
             */
            if (aae180.multiply(aae202).multiply(aaa043).setScale(2, BigDecimal.ROUND_HALF_UP).compareTo(aae262) != 0) {
                //单位
                errMsg.append(aae001 + "年:单位本金与实际计算不一致;");
            }
            if (aae180.multiply(aae202).multiply(aaa045).setScale(2, BigDecimal.ROUND_HALF_UP).compareTo(aae264) != 0) {
                //个人
                errMsg.append(aae001 + "年:个人本金与实际计算不一致;");
            }
            if (aae797.multiply(aae202).multiply(aae819).compareTo(aae855) != 0) {
                //社平
                errMsg.append(aae001 + "年:社平本金与实际计算不一致;");
            }
            //非手工录入标志 检查利息
            if (!Constant.SFBZ_1_S.equals(aae825)) {
                if (aae001 <= 2006) {
                    //单位利息： 单位利息 = 单位本金 * 本年利率 * 月数 /12 /2  保留2位小数
                    BigDecimal aae263_n = aae262.multiply(baa054).multiply(aae202).divide(new BigDecimal(12), 4).divide(new BigDecimal(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//单位本年利息
                    if (aae263.compareTo(aae263_n) != 0) {
                        errMsg.append(aae001 + "年:单位利息与实际计算不一致;");
                    }
                    //个人利息： 个人利息 = 人员本金 * 本年利率 * 月数 /12 /2  保留2位小数
                    BigDecimal aae265_n = aae264.multiply(baa054).multiply(aae202).divide(new BigDecimal(12), 4).divide(new BigDecimal(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//个人本年利息
                    if (aae265.compareTo(aae265_n) != 0) {
                        errMsg.append(aae001 + "年:个人利息与实际计算不一致;");
                    }
                    //社平划入利息： 社平划入利息 = 社平划入本金 * 本年利率 * 月数 /12 /2  保留2位小数
                    BigDecimal aae856_n = aae855.multiply(baa054).multiply(aae202).divide(new BigDecimal(12), 4).divide(new BigDecimal(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//社平计入利息（%）
                    if (aae856.compareTo(aae856_n) != 0) {
                        errMsg.append(aae001 + "年:社平利息与实际计算不一致;");
                    }
                } else {
                    //单位利息： 单位利息 = 单位本金 * 本年利率 * 1.083 /2  保留2位小数
                    BigDecimal aae263_n = aae262.multiply(baa054).multiply(BigDecimal.valueOf(1.083)).divide(BigDecimal.valueOf(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//单位本年利息
                    myMap.put("aae263", aae263);
                    if (aae263.compareTo(aae263_n) != 0) {
                        errMsg.append(aae001 + "年:单位利息与实际计算不一致;");
                    }
                    //个人利息： 个人利息 = 人员本金 * 本年利率 * 1.083 /2  保留2位小数
                    BigDecimal aae265_n = aae264.multiply(baa054).multiply(BigDecimal.valueOf(1.083)).divide(BigDecimal.valueOf(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//个人本年利息
                    if (aae265.compareTo(aae265_n) != 0) {
                        errMsg.append(aae001 + "年:个人利息与实际计算不一致;");
                    }
                    //社平划入利息： 社平划入利息 = 社平划入本金 * 本年利率 * 1.083 /2  保留2位小数
                    BigDecimal aae856_n = aae855.multiply(baa054).multiply(BigDecimal.valueOf(1.083)).divide(BigDecimal.valueOf(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//社平计入利息（%）
                    if (aae856.compareTo(aae856_n) != 0) {
                        errMsg.append(aae001 + "年:社平利息与实际计算不一致;");
                    }
                }
                //获取上一年的信息
                List<MyMap> list = ac50A4Map.get(String.valueOf(myMap.getAsInteger("aae001") - 1));
                if (!ValidateUtil.isEmpty(list)) {
                    MyMap myMap1 = new MyMap(list.get(0));
                    //2、截至上年末个人账户单位缴费部分划转累计本息(AAE849) = 上一年单位缴费部分划转累计本息(AAE849) + 上一年当年单位本金 + 上一年当年单位利息
                    BigDecimal lastYearAae849 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae849")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae849");//上一年单位缴费部分划转累计本息
                    BigDecimal lastYearAae262 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae262")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae262");//上一年当年单位本金
                    BigDecimal lastYearAae263 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae263")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae263");//上一年当年单位利息

                    //4、截至上年末个人账户个人缴费部分划转累计本息(AAE851) = 上一年单位缴费部分划转累计本息(AAE851) + 上一年当年个人本金 + 上一年当年个人利息
                    BigDecimal lastYearAae851 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae851")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae851");//上一年单位缴费部分划转累计本息
                    BigDecimal lastYearAae264 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae264")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae264");//上一年当年个人本金
                    BigDecimal lastYearAae265 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae265")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae265");//上一年当年个人利息

                    //6、截至上年末个人账户其他部分划转累计本息（AAE853） = 上一年截至上年末个人账户其他部分划转累计本息（AAE853） + 上年社平本金 + 上年社平利息
                    BigDecimal lastYearAae853 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae853")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae853");//上一年截至上年末个人账户其他部分划转累计本息
                    BigDecimal lastYearAae855 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae855")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae855");//上年社平本金
                    BigDecimal lastYearAae856 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae856")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae856");//上年社平利息

                    BigDecimal lastYearAae259 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae259")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae259");//截至上年末个人账户单位缴费部分划转本息在本年产生的利息
                    BigDecimal lastYearAae260 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae260")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae260");//截至上年末个人账户个人缴费部分划转本息在本年产生的利息
                    BigDecimal lastYearAae854 = ValidateUtil.isEmpty(myMap1.getAsBigDecimal("aae854")) ? BigDecimal.ZERO : myMap1.getAsBigDecimal("aae854");//截至上年末个人账户其他部分划转本息在本年产生的利息

                    if (aae001 <= 2006) {
                        //3、截至上年末个人账户单位缴费部分划转本息在本年产生的利息(AAE259) = 截至上年末个人账户单位缴费部分划转累计本息(AAE849) * 历年利率 /12 * 应缴月数
                        BigDecimal aae259_n = (lastYearAae849.add(lastYearAae262).add(lastYearAae263).add(lastYearAae259)).multiply(baa055).divide(new BigDecimal(12), 4).multiply(aae201).setScale(2, BigDecimal.ROUND_HALF_UP);
                        if (aae259.compareTo(aae259_n) != 0) {
                            errMsg.append(aae001 + "年:截至上年末单位缴费累计利息在本年的利息与实际计算不一致;");
                        }
                        //5、截至上年末个人账户个人缴费部分划转本息在本年产生的利息(AAE260) = 截至上年末个人账户个人缴费部分划转累计本息(AAE851) * 历年利率 /12 * 应缴月数
                        BigDecimal aae260_n = (lastYearAae851.add(lastYearAae264).add(lastYearAae265).add(lastYearAae260)).multiply(baa055).divide(new BigDecimal(12), 4).multiply(aae201).setScale(2, BigDecimal.ROUND_HALF_UP);
                        if (aae260.compareTo(aae260_n) != 0) {
                            errMsg.append(aae001 + "年:截至上年末个人缴费累计利息在本年的利息与实际计算不一致;");
                        }

                        //7、截至上年末个人账户其他部分划转本息在本年产生的利息(AAE854) = 截至上年末个人账户其他部分划转累计本息（AAE853） * 历年利率 /12 * 应缴月数
                        BigDecimal aae854_n = (lastYearAae853.add(lastYearAae855).add(lastYearAae856).add(lastYearAae854)).multiply(baa055).divide(new BigDecimal(12), 4).multiply(aae201).setScale(2, BigDecimal.ROUND_HALF_UP);
                        if (aae854.compareTo(aae854_n) != 0) {
                            errMsg.append(aae001 + "年:截至上年末其他缴费累计利息在本年的利息与实际计算不一致;");
                        }
                    } else {
                        //3、截至上年末个人账户单位缴费部分划转本息在本年产生的利息(AAE259) = 截至上年末个人账户单位缴费部分划转累计本息(AAE849) * 历年利率
                        BigDecimal aae259_n = (lastYearAae849.add(lastYearAae262).add(lastYearAae263).add(lastYearAae259)).multiply(baa055).setScale(2, BigDecimal.ROUND_HALF_UP);
                        if (aae259.compareTo(aae259_n) != 0) {
                            errMsg.append(aae001 + "年:截至上年末单位缴费累计利息在本年的利息与实际计算不一致;");
                        }
                        //5、截至上年末个人账户个人缴费部分划转本息在本年产生的利息(AAE260) = 截至上年末个人账户个人缴费部分划转累计本息(AAE851) * 历年利率
                        BigDecimal aae260_n = (lastYearAae851.add(lastYearAae264).add(lastYearAae265).add(lastYearAae260)).multiply(baa055).setScale(2, BigDecimal.ROUND_HALF_UP);
                        if (aae260.compareTo(aae260_n) != 0) {
                            errMsg.append(aae001 + "年:截至上年末个人缴费累计利息在本年的利息与实际计算不一致;");
                        }

                        //7、截至上年末个人账户其他部分划转本息在本年产生的利息(AAE854) = 截至上年末个人账户其他部分划转累计本息（AAE853） * 历年利率
                        BigDecimal aae854_n = (lastYearAae853.add(lastYearAae855).add(lastYearAae856).add(lastYearAae854)).multiply(baa055).setScale(2, BigDecimal.ROUND_HALF_UP);
                        if (aae854.compareTo(aae854_n) != 0) {
                            errMsg.append(aae001 + "年:截至上年末其他缴费累计利息在本年的利息与实际计算不一致;");
                        }
                    }

                    //截至上年末单位缴费累计本息检查
                    BigDecimal aae849_before = lastYearAae849.add(lastYearAae262).add(lastYearAae263).add(lastYearAae259);
                    if (aae849_before.compareTo(aae849) != 0) {
                        errMsg.append(aae001 + "年:截至上年末单位缴费累计本息与实际计算不一致;");
                    }
                    //截至上年末个人缴费累计本息检查
                    BigDecimal aae851_before = lastYearAae851.add(lastYearAae264).add(lastYearAae265).add(lastYearAae260);
                    if (aae851_before.compareTo(aae851) != 0) {
                        errMsg.append(aae001 + "年:截至上年末个人缴费累计本息与实际计算不一致;");
                    }
                    //截至上年末其他缴费累计本息检查
                    BigDecimal aae853_before = lastYearAae853.add(lastYearAae855).add(lastYearAae856).add(lastYearAae854);
                    if (aae853_before.compareTo(aae853) != 0) {
                        errMsg.append(aae001 + "年:截至上年末其他缴费累计本息与实际计算不一致;");
                    }
                    //当年年度总额
                    BigDecimal aae878_n = aae262.add(aae263).add(aae264).add(aae265).add(aae855).add(aae856).add(aae849).add(aae259).add(aae851).add(aae260).add(aae853).add(aae854);
                    if (aae878.compareTo(aae878_n) != 0) {
                        errMsg.append(aae001 + "年:个人账户总额与实际计算不一致;");
                    }
                }
                if (!ValidateUtil.isEmpty(errMsg) && errMsg.length() > 0) {
                    map.put("aae013", errMsg);
                    map.put("errorCode", "0");
                } else {
                    map.put("errorCode", "1");
                    map.put("aae013", "");
                }
            }
        });
    }


    /**
     * 根据年度获取最近的年度转换对应的月数
     *
     * @param aae001
     * @return
     */
    private Integer getBeforeBae095(Integer aae001) {
        ac50a5s.sort(Comparator.comparing(myMap -> myMap.getAsInteger("aae001")));
        Collections.reverse(ac50a5s);
        for (Map map : ac50a5s) {
            MyMap myMap = new MyMap(map);
            if (aae001 > myMap.getAsInteger("aae001")) {
                return myMap.getAsInteger("bae095");
            }

        }
        return 0;
    }

    public void init(MyMap myMap) {
        this.accountDetail = (List<Map>) myMap.get("accountDetail");
        this.ac51s = (List<Map>) myMap.get("ac51s");
        this.ac02Map = (Map) myMap.get("ac02Map");
    }

    public SpecialAccount() {
        //TODO
    }

    private void check() {
        NPETool.isEmptyThrowException(this.aaz116, "账户ID");
        NPETool.isEmptyThrowException(this.aae206, "建立账户年月");
        NPETool.isEmptyThrowException(this.accountDetail, "台账信息");
    }

    /**
     * 才分账户时获取对应费款所属期
     *
     * @param aae003
     * @param aae001
     * @param nonth_n
     * @param bae095
     */
    public void getAae003(Integer aae003, Integer aae001, Integer nonth_n, Integer bae095) {
//        if (nonth_n == 0) {
//            if (aae001 == this.aae206 / 100) {
//                aae003 = aae206;
//            } else {
//                aae003 = getAae041(aae001, bae095);
//            }
//
//        } else {
//            try {
//                aae003 = DateUtil.addMonth(aae003, 1);
//            } catch (ParseException e) {
////                LogUtil.error(e);
//            }
//        }
        //todo
    }

    public Integer getAae041(Integer aae001, Integer bae095) {
        Integer aae003;
        if (bae095.intValue() == 12) {//自然年度
            //查询出年度月数不为12的条数
            if (ValidateUtil.isNotEmpty(ac50a5s)) {
                //查询出上一年bae095_before
                Integer bae095_before = getBeforeBae095(aae001);
                if (bae095_before == 15) {
                    aae003 = Integer.valueOf(aae001 + "04");
                } else if (bae095_before == 18) {
                    aae003 = Integer.valueOf(aae001 + "07");
                } else {
                    aae003 = Integer.valueOf(aae001 + "01");
                }
            } else {
                aae003 = Integer.valueOf(aae001 + "01");
            }
        } else if (bae095 == 15) {//业务年度15
            aae003 = Integer.valueOf(aae001 + "01");
        } else if (bae095 == 9) {//业务年度9
            aae003 = Integer.valueOf(aae001 + "04");
        } else if (bae095 == 18) {//业务年度9
            aae003 = Integer.valueOf(aae001 + "01");
        } else if (bae095 == 6) {//业务年度9
            aae003 = Integer.valueOf(aae001 + "07");
        } else {
            throw new IllegalArgumentException("暂不支持的业务年度");
        }
        return aae003;
    }

    /**
     * 账户计算
     * 横向计算：
     * 1、单位本金 = 基数总额 * 单位缴费比例 * 实缴月数
     * 2、个人本金 = 基数总额 * 个人缴费比例 * 实缴月数
     * 3、本年利息 = 本年本金 * 当年利率
     * 4、社平划入本金 = 上年社平工资 * 社平划入比例 *
     */
    public void transverseCalculate() {
        NPETool.isEmptyThrowException(accountDetail, "没有获取到账户台账明细！");
        resultList = new ArrayList<>();
        for (Map map : accountDetail) {
            MyMap myMap = new MyMap(map);
            Integer aae001 = myMap.getAsInteger("aae001");
            BigDecimal aae202 = ValidateUtil.isEmpty(myMap.getAsString("aae202")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae202");//实缴月数
            BigDecimal aae201 = ValidateUtil.isEmpty(myMap.getAsString("aae201")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae201");//实缴月数
            BigDecimal aae180 = ValidateUtil.isEmpty(myMap.getAsString("aae180")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae180");//基数
            BigDecimal baa054 = ValidateUtil.isEmpty(myMap.getAsString("baa054")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("baa054");//当年利率
            //单位：
            BigDecimal aaa043 = ValidateUtil.isEmpty(myMap.getAsString("aaa043")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aaa043");//单位划入比例（%）
            //单位本金： 单位本金 = 基数总额 * 单位缴费比例 * 实缴月数
            BigDecimal aae262 = aae180.multiply(aaa043).multiply(aae202).setScale(2, BigDecimal.ROUND_HALF_UP);//单位本金
            myMap.put("aae262", aae262);

            //个人：
            BigDecimal aaa045 = ValidateUtil.isEmpty(myMap.getAsString("aaa045")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aaa045");//个人划入比例（%）
            //个人本金：个人本金 = 基数总额 * 个人缴费比例 * 实缴月数
            BigDecimal aae264 = aae180.multiply(aaa045).multiply(aae202).setScale(2, BigDecimal.ROUND_HALF_UP);
            myMap.put("aae264", aae264);

            //社平：
            BigDecimal aae797 = ValidateUtil.isEmpty(myMap.getAsString("aae797")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae797");//当地上年社会平均工资
            BigDecimal aae819 = ValidateUtil.isEmpty(myMap.getAsString("aae819")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae819");//社平划入比例（%）
            //社平划入本金 ：社平划入本金 = 上年社平工资 * 社平划入比例 * 实缴月数
            BigDecimal aae855 = aae797.multiply(aae819).multiply(aae202).setScale(2, BigDecimal.ROUND_HALF_UP);//社平划入本金（%）
            myMap.put("aae855", aae855);

            //利息：
            if (!Constant.BAE926_1_S.equals(myMap.getAsString("aae825"))) {//手工录入标志
                if (aae001 <= 2006) {
                    //单位利息： 单位利息 = 单位本金 * 本年利率 * 月数 /12 /2  保留2位小数
                    BigDecimal aae263 = aae262.multiply(baa054).multiply(aae201).divide(new BigDecimal(12), 4).divide(new BigDecimal(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//单位本年利息
                    myMap.put("aae263", aae263);

                    //个人利息： 个人利息 = 人员本金 * 本年利率 * 月数 /12 /2  保留2位小数
                    BigDecimal aae265 = aae264.multiply(baa054).multiply(aae201).divide(new BigDecimal(12), 4).divide(new BigDecimal(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//个人本年利息
                    myMap.put("aae265", aae265);
                    //社平划入利息： 社平划入利息 = 社平划入本金 * 本年利率 * 月数 /12 /2  保留2位小数
                    BigDecimal aae856 = aae855.multiply(baa054).multiply(aae201).divide(new BigDecimal(12), 4).divide(new BigDecimal(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//社平计入利息（%）
                    myMap.put("aae856", aae856);
                } else {
                    //单位利息： 单位利息 = 单位本金 * 本年利率 * 1.083 /2  保留2位小数
                    BigDecimal aae263 = aae262.multiply(baa054).multiply(BigDecimal.valueOf(1.083)).divide(BigDecimal.valueOf(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//单位本年利息
                    myMap.put("aae263", aae263);

                    //个人利息： 个人利息 = 人员本金 * 本年利率 * 1.083 /2  保留2位小数
                    BigDecimal aae265 = aae264.multiply(baa054).multiply(BigDecimal.valueOf(1.083)).divide(BigDecimal.valueOf(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//个人本年利息
                    myMap.put("aae265", aae265);
                    //社平划入利息： 社平划入利息 = 社平划入本金 * 本年利率 * 1.083 /2  保留2位小数
                    BigDecimal aae856 = aae855.multiply(baa054).multiply(BigDecimal.valueOf(1.083)).divide(BigDecimal.valueOf(2), 4).setScale(2, BigDecimal.ROUND_HALF_UP);//社平计入利息（%）
                    myMap.put("aae856", aae856);
                }
            }
            resultList.add(myMap);
        }
    }


    /**
     * 账户计算(必须先横向计算好)
     * 纵向计算：
     * 1、截止上年末累计实际缴费月数(aae091) = 上一年的累计缴费月数(aae091) + 当年实缴月数(aae201)
     * 2、截至上年末个人账户单位缴费部分划转累计本息(AAE849) = 上一年单位缴费部分划转累计本息(AAE849) + 上一年当年单位本金 + 上一年当年单位利息
     * 3、截至上年末个人账户单位缴费部分划转本息在本年产生的利息(AAE259) = 截至上年末个人账户单位缴费部分划转累计本息(AAE849) * 历年利率
     * 4、截至上年末个人账户个人缴费部分划转累计本息(AAE851) = 上一年单位缴费部分划转累计本息(AAE851) + 上一年当年个人本金 + 上一年当年个人利息
     * 5、截至上年末个人账户个人缴费部分划转本息在本年产生的利息(AAE260) = 截至上年末个人账户个人缴费部分划转累计本息(AAE851) * 历年利率
     * 6、截至上年末个人账户其他部分划转累计本息（AAE853） = 上一年截至上年末个人账户其他部分划转累计本息（AAE853） + 上年社平本金 + 上年社平利息
     * 7、截至上年末个人账户其他部分划转本息在本年产生的利息(AAE854) = 截至上年末个人账户其他部分划转累计本息（AAE853） * 历年利率
     * 8、截至本年末个人账户总额(BAE934) = 2 + 3 + 4 + 5 + 6 + 7 + 当年单位本金 + 当年单位利息 + 当年个人本金 + 当年个人利息 + 当年社平本金 + 当年社平利息
     */
    public void portraitCalculate() {
        if (ValidateUtil.isNotEmpty(resultList)) {
            resultList.sort(Comparator.comparing(myMap -> myMap.getAsInteger("aae001")));
            Map<Integer, List<MyMap>> ac50A4Map = resultList.stream().collect(Collectors.groupingBy(myMap -> myMap.getAsInteger("aae001")));
            for (MyMap myMap : resultList) {
                BigDecimal baa055 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("baa055")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("baa055");//历年年利率
                Integer aae001 = myMap.getAsInteger("aae001");//年度
                Integer lastYear = myMap.getAsInteger("aae001") - 1;//上年度
                BigDecimal aae201 = myMap.getAsBigDecimal("aae201");//缴费月数
                List<MyMap> lastYears = ac50A4Map.get(lastYear);
                if (ValidateUtil.isNotEmpty(lastYears)) {//如果没有代表是第一年
                    MyMap lastYearMap = lastYears.get(0);

                    //1、截止上年末累计实际缴费月数(aae091) = 上一年的累计缴费月数(aae091) + 当年实缴月数(aae201)
                    Integer aae091 = (lastYearMap.getAsInteger("aae091")==null?0:lastYearMap.getAsInteger("aae091")) + (myMap.getAsInteger("aae202")==null?0:myMap.getAsInteger("aae202"));
                    myMap.put("aae091", aae091);

                    //2、截至上年末个人账户单位缴费部分划转累计本息(AAE849) = 上一年单位缴费部分划转累计本息(AAE849) + 上一年当年单位本金 + 上一年当年单位利息+上一年单位缴费部分划转累计本息在上一年的利息
                    BigDecimal lastYearAae849 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae849")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae849");//上一年单位缴费部分划转累计本息
                    BigDecimal lastYearAae259 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae259")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae259");//上一年单位缴费部分划转累计本息在上一年的利息
                    BigDecimal lastYearAae262 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae262")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae262");//上一年当年单位本金
                    BigDecimal lastYearAae263 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae263")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae263");//上一年当年单位利息
                    BigDecimal aae849 = lastYearAae259.add(lastYearAae849).add(lastYearAae262).add(lastYearAae263);
                    myMap.put("aae849", aae849);


                    //4、截至上年末个人账户个人缴费部分划转累计本息(AAE851) = 上一年单位缴费部分划转累计本息(AAE851) + 上一年当年个人本金 + 上一年当年个人利息+上一年单位缴费部分划转累计本息在上一年的利息
                    BigDecimal lastYearAae851 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae851")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae851");//上一年单位缴费部分划转累计本息
                    BigDecimal lastYearAae260 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae260")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae260");//上一年单位缴费部分划转累计本息在上一年的利息
                    BigDecimal lastYearAae264 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae264")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae264");//上一年当年个人本金
                    BigDecimal lastYearAae265 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae265")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae265");//上一年当年个人利息
                    BigDecimal aae851 = lastYearAae260.add(lastYearAae851).add(lastYearAae264).add(lastYearAae265);
                    myMap.put("aae851", aae851);


                    //6、截至上年末个人账户其他部分划转累计本息（AAE853） = 上一年截至上年末个人账户其他部分划转累计本息（AAE853） + 上年社平本金 + 上年社平利息+上一年截至上年末个人账户其他部分划转累计本息在上一年的利息
                    BigDecimal lastYearAae853 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae853")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae853");//上一年截至上年末个人账户其他部分划转累计本息
                    BigDecimal lastYearAae855 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae855")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae855");//上年社平本金
                    BigDecimal lastYearAae854 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae854")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae854");//上一年截至上年末个人账户其他部分划转累计本息在上一年的利息
                    BigDecimal lastYearAae856 = ValidateUtil.isEmpty(lastYearMap.getAsBigDecimal("aae856")) ? BigDecimal.ZERO : lastYearMap.getAsBigDecimal("aae856");//上年社平利息
                    BigDecimal aae853 = lastYearAae854.add(lastYearAae853).add(lastYearAae855).add(lastYearAae856);
                    myMap.put("aae853", aae853);

                    BigDecimal aae259 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae259")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae259");//截至上年末个人账户单位缴费部分划转本息在本年产生的利息
                    BigDecimal aae260 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae260")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae260");//截至上年末个人账户个人缴费部分划转本息在本年产生的利息
                    BigDecimal aae854 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae854")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae854");//截至上年末个人账户其他部分划转本息在本年产生的利息
                    //利息：
                    if (!Constant.BAE926_1_S.equals(myMap.getAsString("bae926"))) {//手工录入标志
                        if (aae001 <= 2006) {
                            //3、截至上年末个人账户单位缴费部分划转本息在本年产生的利息(AAE259) = 截至上年末个人账户单位缴费部分划转累计本息(AAE849) * 历年利率 /12 * 应缴月数
                            aae259 = aae849.multiply(baa055).divide(new BigDecimal(12), 4).multiply(aae201).setScale(2, BigDecimal.ROUND_HALF_UP);
                            myMap.put("aae259", aae259);

                            //5、截至上年末个人账户个人缴费部分划转本息在本年产生的利息(AAE260) = 截至上年末个人账户个人缴费部分划转累计本息(AAE851) * 历年利率 /12 * 应缴月数
                            aae260 = aae851.multiply(baa055).divide(new BigDecimal(12), 4).multiply(aae201).setScale(2, BigDecimal.ROUND_HALF_UP);
                            myMap.put("aae260", aae260);

                            //7、截至上年末个人账户其他部分划转本息在本年产生的利息(AAE854) = 截至上年末个人账户其他部分划转累计本息（AAE853） * 历年利率 /12 * 应缴月数
                            aae854 = aae853.multiply(baa055).divide(new BigDecimal(12), 4).multiply(aae201).setScale(2, BigDecimal.ROUND_HALF_UP);
                            myMap.put("aae854", aae854);
                        } else {
                            //3、截至上年末个人账户单位缴费部分划转本息在本年产生的利息(AAE259) = 截至上年末个人账户单位缴费部分划转累计本息(AAE849) * 历年利率
                            aae259 = aae849.multiply(baa055).setScale(2, BigDecimal.ROUND_HALF_UP);
                            myMap.put("aae259", aae259);

                            //5、截至上年末个人账户个人缴费部分划转本息在本年产生的利息(AAE260) = 截至上年末个人账户个人缴费部分划转累计本息(AAE851) * 历年利率
                            aae260 = aae851.multiply(baa055).setScale(2, BigDecimal.ROUND_HALF_UP);
                            myMap.put("aae260", aae260);

                            //7、截至上年末个人账户其他部分划转本息在本年产生的利息(AAE854) = 截至上年末个人账户其他部分划转累计本息（AAE853） * 历年利率
                            aae854 = aae853.multiply(baa055).setScale(2, BigDecimal.ROUND_HALF_UP);
                            myMap.put("aae854", aae854);
                        }
                    }

                    //8、截至本年末个人账户总额(aae878) = 2 + 3 + 4 + 5 + 6 + 7 + 当年单位本金 + 当年单位利息 + 当年个人本金 + 当年个人利息 + 当年社平本金 + 当年社平利息
                    BigDecimal aae262 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae262")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae262");//本年单位本金
                    BigDecimal aae263 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae263")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae263");//本年单位利息
                    BigDecimal aae264 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae264")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae264");//本年个人本金
                    BigDecimal aae265 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae265")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae265");//本年个人利息
                    BigDecimal aae855 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae855")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae855");//本年社平本金
                    BigDecimal aae856 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae856")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae856");//本年社平利息
                    BigDecimal aae879 = aae262.add(aae263).add(aae264).add(aae265).add(aae855).add(aae856);
                    BigDecimal aae878 = aae849.add(aae259).add(aae851).add(aae260).add(aae853).add(aae854).add(aae262).add(aae263).add(aae264).add(aae265).add(aae855).add(aae856);
                    myMap.put("aae878", aae878);
                    myMap.put("aae879", aae879);
                } else {//第一年计算本年末金额
                    //截至本年末个人账户总额(aae878) = 2 + 3 + 4 + 5 + 6 + 7 + 当年单位本金 + 当年单位利息 + 当年个人本金 + 当年个人利息 + 当年社平本金 + 当年社平利息
                    BigDecimal aae262 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae262")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae262");//本年单位本金
                    BigDecimal aae263 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae263")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae263");//本年单位利息
                    BigDecimal aae264 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae264")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae264");//本年个人本金
                    BigDecimal aae265 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae265")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae265");//本年个人利息
                    BigDecimal aae855 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae855")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae855");//本年社平本金
                    BigDecimal aae856 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae856")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae856");//本年社平利息
                    BigDecimal aae259 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae259")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae259");//上一年单位缴费部分划转累计本息在上一年的利息
                    BigDecimal aae260 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae260")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae260");//截至上年末个人账户个人缴费部分划转本息在本年产生的利息
                    BigDecimal aae854 = ValidateUtil.isEmpty(myMap.getAsBigDecimal("aae854")) ? BigDecimal.ZERO : myMap.getAsBigDecimal("aae854");//截至上年末个人账户其他部分划转本息在本年产生的利息
                    BigDecimal aae879 = aae262.add(aae263).add(aae264).add(aae265).add(aae855).add(aae856);
                    myMap.put("aae259", aae259);
                    myMap.put("aae260", aae260);
                    myMap.put("aae854", aae854);
                    myMap.put("aae878", aae879);
                    myMap.put("aae879", aae879);
                }
            }

        }
    }

    /**
     * 账户换变成正常的账户台账
     *
     * @return
     */
    public void specialToNormal() {
        //账户换变成正常的账户台账
    }


    private void makeAc08(MyMap myMap) {
        if (BigDecimal.ZERO.compareTo(myMap.getAsBigDecimal("aae262")) < 0 || BigDecimal.ZERO.compareTo(myMap.getAsBigDecimal("aae264")) < 0 || BigDecimal.ZERO.compareTo(myMap.getAsBigDecimal("aae855")) < 0) { //
            BigDecimal aae180 = myMap.getAsBigDecimal("aae180");
            myMap.putAll(ac02Map);
            myMap.put("aab121", aae180);//缴费基数
            myMap.put("aae180", aae180);//缴费基数
            myMap.put("aae795", aae180);//缴费基数
            myMap.put("aae871", aae180);//缴费基数
            myMap.put("aac040", aae180);//缴费基数
            myMap.put("aae003", myMap.getAsString("aae001") + "01");
            myMap.put("aaa093", Constant.AAA093_1_GRJ);
            myMap.put("aae737", Constant.AAE737_10_CBDX);
            myMap.put("aac028", Constant.AAC028_0_FNMG);
            myMap.put("aae020", myMap.getAsString("aae262"));
            myMap.put("aae021", myMap.getAsString("aae262"));//单位应缴划入个人账户金额
            myMap.put("aae022", myMap.getAsString("aae264"));//个人应缴金额
            myMap.put("aae023", myMap.getAsString("aae264"));//个人应缴划入个人账户金额
            myMap.put("aae026", myMap.getAsString("aae855"));//其他来源应缴金额
            myMap.put("aae828", Constant.AAE828_0_F);//利息征收标志
            myMap.put("aae834", Constant.AAE834_0_F);//滞纳金征收标志
            myMap.put("aab191", myMap.getAsString("aae001") + "1231");//到账日期
            myMap.put("aae080", myMap.getAsString("aae262"));//单位实缴金额
            myMap.put("aae081", myMap.getAsString("aae262"));//单位实缴划入个人账户金额
            myMap.put("aae082", myMap.getAsString("aae264"));//个人实缴金额
            myMap.put("aae083", myMap.getAsString("aae264"));//个人实缴划入个人账户金额
            myMap.put("aae086", myMap.getAsString("aae855"));//其他来源实缴金额
            myMap.put("aae741", Constant.AAE741_8_FZSSR);//数据来源
            myMap.put("aaa042", myMap.getAsString("aaa043"));//单位缴费比例或定额标准
            myMap.put("aaa043", myMap.getAsString("aaa043"));//单位缴费划入个人账户比例或定额标准
            myMap.put("aaa041", myMap.getAsString("aaa045"));//个人缴费比例或定额标准
            myMap.put("aaa045", myMap.getAsString("aaa045"));//个人缴费划入个人账户比例或定额标准
            myMap.put("aae108", Constant.AAE108_0_F);//参加单位结算标志
            myMap.put("aae820", myMap.getAsString("baa054") + "|" + myMap.getAsString("baa055"));//缴费备用字段2
            myMap.put("aaa115", Constant.AAA115_9022_CJZHTZ.substring(0, 2));
            myMap.put("aae793", Constant.AAA115_9022_CJZHTZ);
            myMap.put("aae794", "采集账户转换");
            myMap.put("aae792", Constant.AAE792_01_ZC);
            myMap.put("aae150", myMap.getAsString("aae001") + "12");
        //    myMap.put("aae066", Sequence.next("aae066"));
            myMap.put("aab033", Constant.AAB033_2_SWDZ);
            myMap.put("aab019", Constant.AAB019_10_QY);
         //   myMap.put("aaz615", Sequence.next("aaz615"));
            //缴费月数计算
            //TODO 月数需要减去
            CheckDetail checkDetail = new CheckDetail(myMap);
            Map map1 = JSON.parseObject(String.valueOf(checkDetail), Map.class);
            this.ac08Detail.add(map1);
        }

    }


}
